package github.ziwukun.jsonql.lang;

import java.util.LinkedList;
import java.util.List;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import github.ziwukun.jsonql.utils.CollectionUtils;

/**
 * select 和 json 关联逻辑
 * @author Hugo.Yu
 */
class SelectJson {
	
	/**
	 * 从JSON字符串中创建Select对象<br>
	 * 形如：
	 * ["name","age",
	 * 		{"fullname":["firstname"]},
	 * 		{"address":[{"经纬度":["经度","维度"]}]}
	 * ]
	 */
	static Select readJson(String json) {
		if(!JSONUtil.isJsonArray(json)) {
			throw new JsonQLFormatException(
				"创建JsonQLSelect对象时，JSON数据字符串必须是JSON Aarry类型",
				"@select语句语法错误-" + json);
		}
		
		JSONArray selectArray = new JSONArray(json);
		List<SelectItem> items = new LinkedList<>();
		for (Object arrayItem : selectArray) {
			// 创建搜索项
			SelectItem newSi = SelectItemJson.readJson(arrayItem.toString());
			
			// 检查是否有重复的搜索项
			if(CollectionUtils.contains(items, item -> {
				return item.prop().equals(newSi.prop());
			})) {
				throw new JsonQLFormatException(
					"创建JsonQLSelect对象时，不能存在重复的搜索项-" + newSi.prop(),
					"@select语句语法错误-" + arrayItem.toString());
			}
			
			items.add(newSi);
		}
		
		if(items.isEmpty()) {
			throw new JsonQLFormatException(
				"创建JsonQLSelect对象时，必须有搜索项",
				"@select语句语法错误-" + json);
		}
		
		return new SelectImpl(items);
	}
	
	static String writeJson(Select select) {
		JSONArray jsonArray = new JSONArray();
		for(SelectItem si : select.listItems()) {
			jsonArray.add(si.isChildEmpty()?
				si.toJSONQL():new JSONObject(si.toJSONQL()));
		}
		
		return jsonArray.toString();
	}
}
